home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
ast_comp
/
cpp-kit.lha
/
c++kit
/
Parse.H
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-11
|
3KB
|
163 lines
/* 9th April, 1993 Mayan Moudgill
*/
#ifndef mPARSE_H
#define mPARSE_H
#include "Scan.H"
class Parse;
class NUMBER;
class STRING;
class IDENT;
class TOKEN;
class CHARAC;
class CHOOSE;
class MATCH0;
template <class T> class MATCH1;
template <class S, class T> class MATCH2;
template <class T> MATCH1<T> MATCH(int (*)(Parse&, T&), T&);
template <class S, class T> MATCH2<S, T> MATCH(int (*)(Parse&, S&, T&), S&, T&);
class Parse {
private:
enum {
And = 1,
Fail = 2,
Succ = 3,
};
Scan * _scan;
Scan::Mark _marks[4096];
Scan::Mark * _mark;
int _state;
int _retn;
public:
Parse()
: _state(Fail) {};
Parse(char * file);
Parse(Scan&);
void open(char * file);
void open(Scan&);
int line()
{ return _scan->line(); }
operator int()
{ return _state != Fail; }
operator () ()
{ return _state != Fail? _retn : 0; }
Parse& operator , ( char);
Parse& operator , ( char *);
Parse& operator , ( Parse& (*)(Parse&));
Parse& operator , ( const NUMBER& );
Parse& operator , ( const STRING& );
Parse& operator , ( const IDENT& );
Parse& operator , ( const TOKEN& );
Parse& operator , ( const CHARAC& );
Parse& operator , ( const CHOOSE& );
friend
Parse& OR(Parse &);
friend
Parse& EOFL(Parse &);
Parse& operator , ( const MATCH0& );
template <class T> friend
Parse& operator , ( Parse&, const MATCH1<T>& );
template <class S, class T> friend
Parse& operator , ( Parse&, const MATCH2<S, T>& );
};
class NUMBER {
friend class Parse;
private:
Token * _token;
public:
NUMBER(Token& token)
: _token(&token) {};
};
class STRING {
friend class Parse;
private:
Token * _token;
public:
STRING(Token& token)
: _token(&token) {};
};
class IDENT {
friend class Parse;
private:
Token * _token;
public:
IDENT(Token& token)
: _token(&token) {};
};
class TOKEN {
friend class Parse;
private:
Token * _token;
public:
TOKEN(Token& token)
: _token(&token) {};
};
class CHARAC {
friend class Parse;
private:
Token * _token;
public:
CHARAC(Token& token)
: _token(&token) {};
};
class CHOOSE {
friend class Parse;
private:
int _retn;
public:
CHOOSE(int retn)
: _retn(retn) {};
};
class MATCH0 {
friend MATCH0 MATCH(int (*)(Parse&));
friend class Parse;
private:
int (*_func)(Parse&);
MATCH0( int (*func)(Parse&) )
: _func(func) {};
};
template <class T> class MATCH1 {
friend MATCH1<T> MATCH(int (*)(Parse&, T&), T&);
friend Parse& operator , ( Parse&, const MATCH1<T>& );
private:
int (*_func)(Parse&, T&);
T& _value;
MATCH1( int (* func)(Parse&, T&), T& value)
: _func(func), _value(value) {};
};
template <class S, class T> class MATCH2 {
friend MATCH2<S, T> MATCH(int (*)(Parse&, T&), S&, T&);
friend Parse& operator , ( Parse&, const MATCH2<S, T>& );
private:
int (*_func)(Parse&, T&);
S& _value1;
T& _value2;
MATCH2( int (*func)(Parse&, S&, T&), S& value1, T& value2)
: _func(func), _value1(value1), _value2(value2) {};
};
#endif